package org.example.test;

import cn.hutool.core.lang.Assert;
import cn.hutool.extra.spring.SpringUtil;
import com.poizon.infrastructure.idem.core.domain.value.enums.IdemDbStoreType;
import com.poizon.infrastructure.idem.core.recovery.IdemDbStoreFailover;
import com.poizon.infrastructure.idem.core.repo.IIdemDbStoreRepo;
import org.junit.Test;
import org.mockito.MockedStatic;
import org.mockito.Mockito;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;

public class IdemDbStoreFailoverTest {


    @Test
    public void changeIdemDbStoreInstantly() throws Exception {
        try {
            IdemDbStoreFailover.changeIdemDbStoreInstantly(null);
        } catch (Exception e) {
            Assert.isTrue(e instanceof IllegalArgumentException);
        }
        try {
            IdemDbStoreFailover.changeIdemDbStoreInstantly("");
        } catch (Exception e) {
            Assert.isTrue(e instanceof IllegalArgumentException);
        }
        Assert.isFalse(IdemDbStoreFailover.changeIdemDbStoreInstantly("11"));

        // 找不到数据库存储实现
        MockedStatic<SpringUtil> springUtilMockedStatic = Mockito.mockStatic(SpringUtil.class);
        springUtilMockedStatic.when(() -> {
            SpringUtil.getBean(anyString(), any(Class.class));
        }).thenReturn(null);

        Assert.isFalse(IdemDbStoreFailover.changeIdemDbStoreInstantly(IdemDbStoreType.redis.getDbStoreType()));

        // 找得到幂等存储实现
        springUtilMockedStatic.when(() -> {
            SpringUtil.getBean(anyString(), any(Class.class));
        }).thenReturn(Mockito.mock(IIdemDbStoreRepo.class));
        Assert.isTrue(IdemDbStoreFailover.changeIdemDbStoreInstantly(IdemDbStoreType.redis.getDbStoreType()));

    }

    @Test
    public void findNormalIdemDbStoreType() throws Exception {
        Assert.isNull(IdemDbStoreFailover.findNormalIdemDbStoreType("1"));
        IdemDbStoreType normalIdemDbStoreType = IdemDbStoreFailover.findNormalIdemDbStoreType(IdemDbStoreType.mongodb.getDbStoreType());
        Assert.equals(normalIdemDbStoreType, IdemDbStoreType.redis);
        normalIdemDbStoreType = IdemDbStoreFailover.findNormalIdemDbStoreType(IdemDbStoreType.redis.getDbStoreType());
       Assert.isNull(normalIdemDbStoreType);
    }

}
